package com.vehiclemanagement.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vehiclemanagement.entity.VehicleInspection;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 车辆年检记录服务接口
 */
public interface VehicleInspectionService extends IService<VehicleInspection> {

    /**
     * 分页查询年检记录
     *
     * @param current          当前页
     * @param size             每页大小
     * @param searchTerm       搜索关键词
     * @param vehicleId        车辆ID
     * @param inspectionType   年检类型
     * @param inspectionResult 年检结果
     * @param status           状态
     * @param startTime        开始时间
     * @param endTime          结束时间
     * @return 分页结果
     */
    IPage<VehicleInspection> pageInspections(Integer current, Integer size, String searchTerm,
                                       Long vehicleId, Integer inspectionType, Integer inspectionResult, Integer status,
                                       LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据ID获取年检记录详情
     *
     * @param id 记录ID
     * @return 年检记录详情
     */
    VehicleInspection getInspectionById(Long id);

    /**
     * 添加年检记录
     *
     * @param inspection 年检记录
     * @return 是否成功
     */
    boolean addInspection(VehicleInspection inspection);

    /**
     * 更新年检记录
     *
     * @param inspection 年检记录
     * @return 是否成功
     */
    boolean updateInspection(VehicleInspection inspection);

    /**
     * 删除年检记录
     *
     * @param id 记录ID
     * @return 是否成功
     */
    boolean deleteInspection(Long id);

    /**
     * 开始年检
     *
     * @param id 记录ID
     * @return 是否成功
     */
    boolean startInspection(Long id);

    /**
     * 完成年检
     *
     * @param id               记录ID
     * @param inspectionDate   年检日期
     * @param inspectionCost   年检费用
     * @param inspectionResult 年检结果
     * @param failReason       不通过原因
     * @param validStartDate   有效期开始日期
     * @param validEndDate     有效期结束日期
     * @param certificateNumber 证书编号
     * @param remark           备注
     * @return 是否成功
     */
    boolean completeInspection(Long id, LocalDateTime inspectionDate, BigDecimal inspectionCost, 
                             Integer inspectionResult, String failReason, LocalDateTime validStartDate, 
                             LocalDateTime validEndDate, String certificateNumber, String remark);

    /**
     * 取消年检
     *
     * @param id     记录ID
     * @param remark 取消原因
     * @return 是否成功
     */
    boolean cancelInspection(Long id, String remark);

    /**
     * 获取指定车辆的年检总费用
     *
     * @param vehicleId 车辆ID
     * @return 年检总费用
     */
    BigDecimal sumInspectionCostByVehicleId(Long vehicleId);

    /**
     * 获取指定车辆的年检次数
     *
     * @param vehicleId 车辆ID
     * @return 年检次数
     */
    Integer countInspectionByVehicleId(Long vehicleId);

    /**
     * 按年检类型统计
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 按类型统计的结果
     */
    List<Map<String, Object>> statisticsByType(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 按月份统计年检费用
     *
     * @param year 年份
     * @return 月度统计结果
     */
    List<Map<String, Object>> statisticsByMonth(Integer year);

    /**
     * 查询即将到期需要年检的车辆
     *
     * @param daysThreshold 天数阈值
     * @return 需要年检的车辆列表
     */
    List<Map<String, Object>> findVehiclesNeedingInspection(Integer daysThreshold);
} 